/**
 * 2016年12月26日
 * 获取用户信息
 */

var pomelo = require('pomelo');

var each = require('async').each;
var waterfall = require('async').waterfall;

var userDao = require('../../dao/userDao');
var consts = require('../../consts/consts');

var redisUser = pomelo.app.get('redisUser');
var mysql = userDao;
var client = redisUser;

var log = console.log;

var player = module.exports;


/**
 * 玩家登录信息
 */
player.playerLogin = function (data, callback) {

    // log('玩家登录信息：', data);

    var gameId = parseInt(data.gameId);
    var playerId = parseInt(data.playerId);
    var ip = data.ip;
    var isRobot = data.isRobot || false;

    var minCoin = consts.ROOM.MIN_COIN;

    var redisCache = false;

    var checkKey = 'onlineGameUser';
    var playerInfo = {};

    waterfall([
        function (cb) {
            // 检查是否已经在其它游戏登录
            // 如果已经在其它游戏登录，则只能等待其它游戏下线才能登录本游戏
            // 如果登录的是本游戏，那么可以再次登录
            // 这里只能被动等待用户从其它游戏中退出，不能再主动踢掉其它地方的连接
            // 防止用户在一个游戏中消费之后进入其它游戏中并且进行消费

            client.hget(checkKey, playerId, function (err, rep) {
                if (err) {
                    cb(err);
                    return;
                }
                if (!rep || parseInt(rep) === 0) {
                    log('玩家%s现在未进行游戏', playerId);
                    cb(null);
                    return;
                }
                if (parseInt(rep) !== gameId) {
                    log('玩家%s现在在游戏%s中', playerId, rep);
                    cb('请先从其它游戏中退出');
                    return;
                }
                cb(null);
            });
        },
        function (cb) {
            client.hgetall(playerId, function (err, rep) {
                log('从redis中查询信息');
                log('err, rep : ', err, rep);
                if (err) {
                    cb(err);
                    return;
                }
                if (rep === null) {
                    cb(null);
                    return;
                }

                if (isNaN(parseInt(rep.coin))) {
                    log('player.js 金钱有误！当前用户金钱不是数字：' + rep.coin);
                    return cb('当前用户 ' + playerId + ' 金钱不是数字：' + rep.coin);
                }

                if (parseInt(rep.coin * 100) < minCoin) { // 最小金钱限制
                    log('player.js 金钱不足！当前用户金钱为：' + rep.coin);
                    return cb('当前用户 ' + playerId + ' 金钱：' + rep.coin);
                }
                else {
                    // playerInfo = rep;

                    // 不再所有属性都用掉
                    playerInfo.coin = rep.coin;
                    playerInfo.playerId = rep.playerId;
                    playerInfo.playerName = rep.playerName;
                    playerInfo.score = rep.score;
                    playerInfo.roundCount = rep.roundCount;

                    if (playerInfo.coin && playerInfo.playerName && !isNaN(parseInt(playerInfo.score)) && !isNaN(parseInt(playerInfo.roundCount))) {
                        redisCache = true;
                    }
                    cb(null);
                }
            });
        },
        function (cb) {  // 从mysql中查询用户信息 1.从game_user中查询用户
            if (redisCache) {  // 如果有redis缓存，跳过
                cb(null);
                return;
            }
            log('从mysql中查询信息！');
            var sql = 'SELECT userId, userName, (coin + (SELECT ifnull(sum(coinChange),0) coinChange FROM game_queue WHERE userId = ? AND isDone = 0) ) as coin, score, roundCount FROM game_user where userId = ?';
            var args = [playerId, playerId];

            mysql.query(sql, args, function (err, rep) {
                if (err) {
                    console.log('playerLogin mysql error: ');
                    console.log(err);
                    cb(err);
                    return;
                }
                if (rep.length === 0) {
                    cb('未查询到此账号：' + playerId);
                    return;
                }
                else {
                    playerInfo.playerId = rep[0].userId;
                    playerInfo.playerName = rep[0].userName;
                    // 如果没有金钱缓存，才更新金钱
                    // if (!coinCache) {
                    playerInfo.coin = rep[0].coin;
                    // }
                    playerInfo.score = rep[0].score;
                    playerInfo.roundCount = rep[0].roundCount;
                }
                // log('mysql信息:', playerInfo);
                cb(null);
            });
        },
        function (cb) {  // 写入用户缓存
            if (redisCache) { // 如果有redis缓存，跳过
                cb(null);
                return;
            }
            client.hmset(playerId, playerInfo, function (err, rep) {
                if (err) {
                    cb(err);
                    return;
                }
                redisCache = true;
                cb(null);
            });
        },
        function (cb) {  // 只要有登录就新增
            var sql = 'insert into game_login_log (gameId, userId, loginIp, addTime) VALUES (?, ?, ?, now())';
            var args = [gameId, playerId, ip];
            mysql.query(sql, args, function (err, rel) {
                if (err) {
                    cb(err);
                    return;
                }
                cb(null);
            });
        },
        function (cb) {  // 写入在线用户信息
            client.hset(checkKey, playerId, gameId, function (err, rep) {
                if (err) {
                    cb(err);
                    return;
                }
                cb(null);
            });
        }
    ],
        function (err) {
            if (err) {
                console.log(err);
                callback(err, null);
                return;
            }

            playerInfo.isRobot = isRobot;
            playerInfo.coin = Math.round(playerInfo.coin * 100);

            log('玩家信息: ', playerInfo);

            callback(null, playerInfo);

        });
};
